package com.hyt.it.ogt.pj.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hyt.it.ogt.pj.model.dto.StudentExtendDTO;
import com.hyt.it.ogt.pj.model.entity.Paper;
import com.hyt.it.ogt.pj.model.entity.Student;
import com.hyt.it.ogt.pj.model.param.TaskPageParam;
import com.hyt.it.ogt.pj.model.vo.ItemScoreSaveVo;
import com.hyt.it.ogt.pj.model.vo.StudentVo;
import com.hyt.it.ogt.pj.model.vo.TaskPageItemVo;
import com.hyt.model.PageParam;

import java.util.List;

/**
 * <p>
 * 考生表 服务类
 * </p>
 *
 * @author qiaozj
 * @since 2020-07-09
 */
public interface IStudentService extends IService<Student> {

    /**
     * 初始化考生
     *
     * @param projectId
     * @return
     */
    List<StudentExtendDTO> initStudent(String projectId);

    /***
     * 获取最后一个考生信息
     * @param projectId
     * @return
     */
    Student getLastOneStudentByProject(String projectId);

    /**
     * 获取科目下的考生
     *
     * @param subjectId
     * @return
     */
    List<Student> selectBySubject(String subjectId);

    /**
     * 获取项目下的考生
     *
     * @param projectId
     * @return
     */
    public List<Student> selectByProject(String projectId);

    /**
     * 获取某项目或者某项目下某科目考生数量
     *
     * @param projectId 评卷项目id
     * @param subjectId 评卷科目id
     * @return 返回考生数量
     */
    Integer getStudentNum(String projectId, String subjectId);

    /**
     * 新增考生
     *
     * @param projectId
     * @param admission
     */
    List<StudentExtendDTO> incrementStudent(String projectId, String admission);

    Integer incrementStudent(String projectId, String admission, List<Paper> papers);

    Student getByAdmissionNum(String projectId, String subjectId, String admissionNum);

    /**
     * 根据考生名称获取考生信息
     *
     * @param pageParam
     * @param projectId
     * @param status
     * @param studentName
     * @return
     */
    IPage<Student> selectStudent(PageParam<Student> pageParam, String projectId, String status, String studentName);

    /**
     * 获取任务分页数据
     *
     * @param pageParam
     * @param param
     * @return
     */
    Page<TaskPageItemVo> taskStudentPage(Page<TaskPageItemVo> pageParam, TaskPageParam param);

    /**
     * 获取学生列表数据
     *
     * @return
     */
    IPage<StudentVo> getStudentList(PageParam<StudentVo> pageParam, String projectId, String subjectId, String paperItem, String placeId, String roomId, String batchId, String name, String currUserId);

    /**
     * 设置学生缺席数据
     *
     * @return
     */
    boolean setStudentAbsent(String taskId, String admissionNum, String userId);

    /**
     * 提交学生单个答题
     *
     * @return
     */
    boolean studentAnswerSingleEvaluate(ItemScoreSaveVo itemScoreSaveVo, String currUserId);

    /**
     * 取消缺席
     *
     * @param taskId
     * @param admissionNum
     * @param currUserId
     * @return
     */
    boolean setStudentNotAbsent(String taskId, String admissionNum, String currUserId);

    /***
     * 获取项目科目下所有的考生信息
     * @param projectId
     * @param subjectId
     * @return
     */
    List<Student> getAllStudentByProjectAndSubjectId(String projectId, String subjectId);

    /**
     * 保存考生信息
     *
     * @param projectId         项目id
     * @param studentExtendDTOs 考生信息
     */
    void saveStudent(String projectId, List<StudentExtendDTO> studentExtendDTOs);

    /**
     * 保存考生信息采集信息
     *
     * @param projectId        项目id
     * @param studentExtendDTO 考生信息
     */
    void saveStudentConfig(String projectId, StudentExtendDTO studentExtendDTO);

    /**
     * 减少的实考人数
     *
     * @param projectId
     * @param admissionNum
     */
    void reduceExamNum(String projectId, String admissionNum);
}
